#include <stdio.h>
#include <stdlib.h>
#include "DoubleLinkList.h"
#include "LinkStack.h"
#include "LinkQueue.h"

void PrintInt(void *ptr)
{
    printf("%ld ",(long)ptr);
}

bool IsOper(void *ptr1,void *ptr2)
{
    long a = (long)ptr1;
    long b = (long)ptr2;

    if(a % b == 0)
    return true;
    return false;
}

bool IsBigger(void *ptr1,void *ptr2)
{
    long a = (long)ptr1;
    long b = (long)ptr2;

    if(a > b)
    return true;
    return false;
}


bool IsNumber(char c)
{
    if(c <= '9' && c >='0')
        return true;
    return false;
}
//计算符操作
bool IsOper3(char c)
{
    switch(c)
    {
        case '+':
        case '-':
        case '*':
        case '/':
        case '(':
        case ')':
        case '=':
            return true;

        default:
            break;
    }
    return false;
}

int Operate(int prev, int next, char c)
{
    switch(c)
    {
        case '+':return prev + next;
        case '-':return prev - next;
        case '*':return prev * next;
        case '/':
            if(next = 0)
            {
                printf("除数为0，异常！\n");
                //退出程序
                exit(-1);
            }
            return prev / next;
        default:
            printf("表达式有误!\n");
            exit(-1);
    }
}
char Precade(char c1, char c2)
{
    char pre[7][7] =
    {         // +   -   *   /   (   )   =
    /* + */    {'>','>','<','<','<','>','>'},
    /* - */    {'>','>','<','<','<','>','>'},
    /* * */    {'>','>','>','>','<','>','>'},
    /* / */    {'>','>','>','>','<','>','>'},
    /* ( */    {'<','<','<','<','<','=','0'},
    /* ) */    {'>','>','>','>','0','>','>'},
    /* = */    {'<','<','<','<','<','0','='}
    };
    int i = 0;
    switch(c1)
    {
        case '+':i = 0;break;
        case '-':i = 1;break;
        case '*':i = 2;break;
        case '/':i = 3;break;
        case '(':i = 4;break;
        case ')':i = 5;break;
        case '=':i = 6;break;
        default:
            break;
    }
    int j = 0;
    switch(c2)
    {
        case '+':j = 0;break;
        case '-':j = 1;break;
        case '*':j = 2;break;
        case '/':j = 3;break;
        case '(':j = 4;break;
        case ')':j = 5;break;
        case '=':j = 6;break;
        default:
            break;
    }
    return pre[i][j];
}

int main()
{
    INITDLLIST(list);

    for(long i = 0; i < 10; i++)
    {
        InsertDLlistHead(&list,(void*)i+1);
    }

    //按位删
    //RemoveByIndex(&list,0,NULL);
    //按值删
    //RemoveByElement(&list,(void*)2,IsOper,NULL);
    // TravelDLlist(&list,PrintInt);
    // printf("\n");
    //按位查
    //printf("value:%ld\n",(long)*FindByIndex(&list,1));
    //按值查
    // DLlist result = FindByElement(&list,(void*)2,IsOper);
    // DLlistSort(&result,IsBigger);
    // TravelDLlist(&result,PrintInt);
    //ClearDLlist(&result,NULL);
    // printf("\n");




    // LStack *s = InitStack();
    // for(long i = 1; i <= 10; i++)
    // {
    //     SPush(s,(void*)i);
    // }

    // while(IsStackEmpty(s) == false)
    // {
    //     printf("%ld ",(long)*GetSTop(s));
    //     SPop(s);
    // }
    // printf("\n");
    // ClearLStack(s,NULL);


    // //数据栈
    // LStack *Nums = InitStack();
    // //符号栈
    // LStack *operS = InitStack();
    // SPush(operS,(void*)'=');

    // char str[100] = {0};
    // scanf("%s",str);

    // //计数器
    // int i = 0;
    // while(str[i] != '\0')
    // {
    //     //是数字
    //     if(IsNumber(str[i]) == true)
    //     {
    //         long n = str[i] - '0';
    //         i++;
    //         while(IsNumber(str[i]) == true)
    //         {
    //             n = n * 10 + str[i] - '0';
    //             i++;
    //         }
    //         SPush(Nums,(void*)n);
    //     }
    //     //是符号
    //     else if(IsOper3(str[i]) == true)
    //     {
    //         switch(Precade((char) *GetSTop(operS),str[i]) )
    //         {
    //             case '>':
    //                 long next =(long) *GetSTop(Nums);
    //                 SPop(Nums);

    //                 long prev = (long)*GetSTop(Nums);
    //                 SPop(Nums);

    //                 char symbol = (char)*GetSTop(operS);
    //                 SPop(operS);

    //                 long result = Operate(prev,next,symbol);
    //                 SPush(Nums,(void*)result);
    //                 break;

    //             case '<':
    //                 SPush(operS,(void*)str[i]);
    //                 i++;
    //                 break;

    //             case '=':
    //                 SPop(operS);
    //                 i++;
    //                 break;
    //             default:
    //                 printf("表达式有错误！\n");
    //                 exit(-1);
    //         }
    //     }
    // }

    // printf("结果是：%ld\n",(long)*GetSTop(Nums));



    //LQueue *q = InitQueue();
    // for(long i = 1; i <= 31; i++)
    // QPush(q,(void*)i);

    // int count = 0;
    // while(GetQueueLen(q) > 1)
    // {
    //     count++;
    //     long number = (long)*GetQFront(q);
    //     QPop(q);

    //     if(count == 3)
    //     {
    //         printf("%ld号被杀死\n",number);
    //         count = 0;
    //     }
    //     else
    //     {
    //         QPush(q,(void*)number);
    //     }
    // }

    // printf("%ld活了下来\n",(long)*GetQFront(q));
    // ClearLQueue(q,NULL);


    return 0;
}